package desmontec.alertas

import desmontec.aluguel.AluguelMaquina
import desmontec.aluguel.ConsumoAluguel
import desmontec.maquinas.Maquina
import desmontec.sistema.SecUser

class AlertaMaquinaService {

	static transactional = true
	def springSecurityService

	def existeAlerta(Maquina maquina) {
		List<AlertaMaquinaManutencao> alertas = AlertaMaquinaManutencao.findAllByMaquina(maquina);
		if (alertas.size() > 0)
			return true;
		return false;
	}

	def criarAlertasManutencao() {
		List<Maquina> maquinas = new ArrayList<Maquina>();
		maquinas = Maquina.findAllByUsuario((SecUser) springSecurityService.getCurrentUser())
		for (int i = 0; i < maquinas.size(); i++) {
			if (!existeAlerta(maquinas.get(i))) {
				List<AluguelMaquina> alugueis = new ArrayList<AluguelMaquina>();
				alugueis = AluguelMaquina.findAllByMaquina(maquinas.get(i));
				float total = 0;

				for (int j = 0; j < alugueis.size(); j++) {
					List<ConsumoAluguel> consumos = new ArrayList<ConsumoAluguel>();
					consumos = ConsumoAluguel.findAllByAluguel(alugueis.get(j));

					for (int k = 0; k < consumos.size(); k++) {
						if (consumos.get(k).dia.after(maquinas.get(i).dataUltimaManutencao)) {
							total += consumos.get(k).horasTrabalhadas
						}
					}
				}
				if (total >= maquinas.get(i).horasParaTroca * 0.9) {
					AlertaMaquinaManutencao alerta = new AlertaMaquinaManutencao();
					alerta.flagAtivo = "S";
					alerta.maquina = maquinas.get(i);
					alerta.save(flush: true);
				}
			}
		}
	}
	
	def atualizaAlertasManutencao(AluguelMaquina aluguel) {
		if (aluguel.flagAtivo == "S"){
			Maquina m = aluguel.maquina
			def consumos = ConsumoAluguel.findAllByAluguel(aluguel);
			double total = 0;
			for (ConsumoAluguel c in consumos) {
				if (c.dia.after(m.dataUltimaManutencao)) {
					total += c.horasTrabalhadas
				}
			}
			if (total >= m.horasParaTroca * 0.9) {
				if (!existeAlerta(m)){
					AlertaMaquinaManutencao alerta = new AlertaMaquinaManutencao(flagAtivo:"S", maquina:m);
					alerta.save(flush: true);
				}
			} else {
				if (existeAlerta(m)) {
					def alertas = AlertaMaquinaManutencao.findAllByMaquina(m)
					for (AlertaMaquinaManutencao a in alertas){
						a.delete(flush:true);
					}
				}
			}
		} else {
			removeAlertasManutencao(aluguel)
		}
	}
	
	def atualizaAlertasManutencao(Maquina maq){
		def alugueis = AluguelMaquina.findAllByMaquina(maq)
		for (AluguelMaquina a in alugueis){
			if (a.flagAtivo == "S"){
				atualizaAlertasManutencao(a)
			}
		}
	}
	
	def removeAlertasManutencao(AluguelMaquina aluguel){
		def alertas = AlertaMaquinaManutencao.findAllByMaquina(aluguel.maquina)
		for (AlertaMaquinaManutencao a in alertas){
			a.delete(flush:true);
		}
	}
	
	def removeAlertasManutencao(Maquina m){
		def alertas = AlertaMaquinaManutencao.findAllByMaquina(m)
		for (AlertaMaquinaManutencao a in alertas){
			a.delete(flush:true);
		}
	}
	
	def alertasDoUsuario(SecUser usuario){
		List<AlertaMaquinaManutencao> alertasUsuario = new ArrayList<AlertaMaquinaManutencao>()
		def maquinas = Maquina.findAllByUsuario(usuario)
		for (Maquina m : maquinas){
			def alertasMaquina = AlertaMaquinaManutencao.findAllByMaquina(m)
			for (AlertaMaquinaManutencao a in alertasMaquina){
				alertasUsuario.add(a)
			} 
		}
		return alertasUsuario
	}

	def alertasAtivosDoUsuario(SecUser usuario){
		List<AlertaMaquinaManutencao> alertasUsuario = new ArrayList<AlertaMaquinaManutencao>()
		def maquinas = Maquina.findAllByUsuario(usuario)
		for (Maquina m : maquinas){
			def alertasMaquina = AlertaMaquinaManutencao.findAllByMaquina(m)
			for (AlertaMaquinaManutencao a in alertasMaquina){
				if (a.flagAtivo == "S"){
					alertasUsuario.add(a)
				}
			}
		}
		return alertasUsuario
	}
	
}
